package week_03.data_move;

import java.lang.reflect.Array;
import java.util.Arrays;

@SuppressWarnings("all")
public class Arr_T<T> {
    private T[] array;

    public Arr_T(Class<T> clz, int length) {
        //通过Array.newInstance的方法创建泛型数组
        array = (T[]) Array.newInstance(clz, length + 1);
    }

    /**
     * 填充数组
     *
     * @param index 传入的数组的序列号
     * @param item  要放入的元素
     */
    public void put(int index, T item) {
        array[index] = item;
    }

    /**
     * 该方法可以将元素删除并且前移元素
     *
     * @param index 要删除的数组元素的序列号
     * @return 可以返回被删除的值
     */
    public T remove(int index) {
        T oldValue = (T) array[index]; //把原来的值保留下来
        array[index] = null;
        final int newSize;
        if ((newSize = array.length - 1) > index) {
            System.arraycopy(array, index + 1, array, index, newSize - index);
            array[array.length - 1] = null;
        }
        return oldValue;
    }

    /**
     * 因为在删除元素之后，数组的后面全是null，他原本的length就对不上有数据的长度
     * 使用遍历将有数据的长度获取出来
     *
     * @return 返回数组有数据的长度
     */
    public int size() {
        int i = 0;
        int newSize = 0;
        for (; i < array.length; i++) {
            if (getArr(i) == null) {
                newSize = i;
                break;
            }
        }
        return newSize;
    }

    /**
     * 获取数组元素
     *
     * @param index 传入数组的序列号
     * @return 获取该序列号下的元素
     */
    public T get(int index) {
        return array[index];
    }

    /**
     * @return 获取整个数组
     */
    public T[] getArray() {
        return array;
    }

    public T getArr(int index) {
        return array[index];
    }

    /**
     * 直接输出数组
     */
    public void show(){
        size();
        String[] arr=new String[size()];
        System.arraycopy(array,0,arr,0,size());
        System.out.println(Arrays.toString(arr));
    }

}
